package com.deliccio.dao.impl;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.deliccio.connect.DAO;
import com.deliccio.dao.ProductoDAO;
import com.deliccio.entitys.Producto;
import com.deliccio.entitys.Ranking;
import com.deliccio.util.Constantes;

@Repository("ProductoDAO")
public class ProductoDAOImpl extends DAO<Producto> implements ProductoDAO{
	
	@Override
	public Producto obtenerTopProducto(Integer idTipo){
			
		sqlQuery=" select r from Ranking  r " +
				 " where r.idtipo.id=:idTipo and r.id>0 and " +
				 " r.puntos = ( select max(rg.puntos) from Ranking rg where rg.id=r.id ) ";
		q=em.createQuery(sqlQuery);
		q.setParameter("idTipo",idTipo);
		q.setMaxResults(1);	
		List pr=q.getResultList();
		if(pr.size()>0){
			return (Producto) pr.get(0);	
		}		
		return null;		
	}

	@Override
	public List<Producto> obtenerActivos(){
		sqlQuery=" select p from Producto p left join fetch p.detalleproductos where p.id>0 and p.estadosgenerales.id= :estado ";
		q=em.createQuery(sqlQuery);
		q.setParameter("estado",Constantes.ESTADO_ACTIVO);
		return q.getResultList();
	}

	@Override
	public Producto obtenerProducto(Integer codprod){
		System.out.println("codprod id:"+codprod);
		sqlQuery=" select " +
				" p " +
				" from Producto p left join fetch p.detalleproductos dt where p.id=:codprod and p.id>0 and p.estadosgenerales.id= :estado ";
		q=em.createQuery(sqlQuery);
		q.setParameter("codprod",codprod);
		q.setParameter("estado",Constantes.ESTADO_ACTIVO);
		q.setMaxResults(1);
		return (Producto) q.getSingleResult();		
	}

	@Override
	public Producto obtenerProductoIds(int id){
		sqlQuery=" select p from Producto p where p.id in (:id) and p.estadosgenerales.id= :estado ";
		q=em.createQuery(sqlQuery);		
		q.setParameter("id",id);
		q.setParameter("estado",Constantes.ESTADO_ACTIVO);
		q.setMaxResults(1);
		return (Producto) q.getSingleResult();
	}

	@Override
	public List<Producto> obtenerProductosPorTipoConjunto(int tipo){	
		//SELECT * FROM producto p where idtipo in (SELECT idparametro FROM parametros p where parametropadre = 3 ) 
		sqlQuery=" select new Producto(p.id,p.nombre,p.estadosgenerales,p.completo) from Producto p where p.idtipo in ( SELECT pr.id FROM Parametros pr where pr.parametroPadre.id = :tipo ) and p.estadosgenerales.id = :estado ";
		q=em.createQuery(sqlQuery);
		q.setParameter("estado",Constantes.ESTADO_ACTIVO);
		q.setParameter("tipo",tipo);
		return q.getResultList();
	}

	@Override
	public Producto obtener(int id){
		sqlQuery=" select p from Producto p left join fetch p.detalleproductos where p.id = :id and p.estadosgenerales.id= :estado ";
		q=em.createQuery(sqlQuery);		
		q.setParameter("id",id);
		q.setParameter("estado",Constantes.ESTADO_ACTIVO);
		q.setMaxResults(1);
		return (Producto) q.getSingleResult();
	}

	@Override
	public List<Producto> obtenerProductoAsignados(int id){
		sqlQuery=" select new Producto(id,nombre) from Producto p where p.id in (select  dp.producto.id from DetalleProducto dp where dp.idProductoConjunto = :id) ";
		q=em.createQuery(sqlQuery);		
		q.setParameter("id",id);
		return  q.getResultList();
	}

	@Override
	public List<Producto> obtenerProductosDisponibles(int id,String nombre,int tipo){
		//SELECT * FROM producto p where p.idproducto not in (1,2,3) and
		//idtipo not in (SELECT idparametro FROM parametros p where parametropadre in (0,3) ) ;		
		sqlQuery=" select new Producto(pr.id,pr.nombre) from Producto pr " +
				" where pr.id not in " +
				"(select p.id from Producto p where p.id in (select dp.producto.id from DetalleProducto dp where dp.idProductoConjunto = :id)) " +
				" and pr.idtipo not in ( select param.id from Parametros param where param.parametroPadre.id in (0,3)  ) and " +
				" pr.nombre like  :nombre ";
		
		if(  tipo>0){
			sqlQuery += " and pr.idtipo.id = :tipo ";
		}
		
		
		q=em.createQuery(sqlQuery);		
		q.setParameter("id",id);
		q.setParameter("nombre","%"+nombre+"%");
		if(  tipo>0){
		q.setParameter("tipo",tipo);
		}
		return  q.getResultList();
	}
	//SELECT * FROM ranking r ORDER BY puntos DESC limit 10;
	@Override
	public List<Ranking> obtenerTop10(){
		sqlQuery=" select r from Ranking r order by r.puntos desc ";
		q=em.createQuery(sqlQuery);
		q.setMaxResults(5);
		return  q.getResultList();		
	}
	
}
